package com.parking.order.util;

import com.parking.common.core.model.Result;
import com.parking.common.core.util.ResultUtil;
import com.parking.order.client.dto.*;
import com.parking.order.client.form.CertifiedScoreForm;
import com.parking.order.client.inter.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 工具类 负责调用其他模块接口
 * */
@Component
public class BasicInfoUtil {
    /**
     * 物业模块方法调用接口
     * */
    @Autowired
    private CertifiedClient certifiedClient;
    /**
     * 平台模块方法调用接口
     * */
    @Autowired
    private PlatformClient platformClient;
    /**
     * 用户模块方法调用接口
     * */
    @Autowired
    private UserClient userClient;
    /**
     * 出租客模块方法调用接口
     * */
    @Autowired
    private RentersClient rentersClient;
    /**
     * 车位模块接口调用
     * */
    @Autowired
    private StallClient stallClient;
    /**
     * 检查后获得物业账号
     * 参数: 物业账号Id certifiedAccountId
     * 返回: 物业账号Id certifiedAccountId
     *      物业账号 certifiedAccountAccount
     *      物业信息Id certifiedInfoId
     * */
    public CertifiedAccountDto getCertifiedAccount(Integer certifiedAccountId) throws Exception {
        Result<CertifiedAccountDto> result = certifiedClient.selectCertifiedAccountById(certifiedAccountId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得物业账号
     * 参数: 物业信息Id   certifiedInfoId
     * 返回: 物业名称     certifiedInfoName
     *      物业电话     certifiedInfoTel
     *      物业地址     certifiedInfoAddress
     *      普通车位单价  stallUnitPrice
     *      充电车位单价  chargeUnitPrice
     *      物业账号Id   certifiedAccountId
     * */
    public CertifiedInfoDto getCertifiedInfo(Integer certifiedInfoId) throws Exception {
        Result<CertifiedInfoDto> result = certifiedClient.selectCertifiedInfoById(certifiedInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 查询所有状态正常的物业信息
     * 返回: 物业信息Id   certifiedInfoId
     *      物业名称     certifiedInfoName
     *      物业电话     certifiedInfoTel
     *      物业地址     certifiedInfoAddress
     *      普通车位单价  stallUnitPrice
     *      充电车位单价  chargeUnitPrice
     *      物业账号Id   certifiedAccountId
     * */
    public List<CertifiedInfoDto> getAllCertifiedInfo() throws Exception {
        Result<List<CertifiedInfoDto>> result = certifiedClient.selectAllCertifiedInfo();
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 更新物业评分
     * 返回: List<CertifiedScoreDto> 物业评分Dto集合
     *      CertifiedScoreDto 物业评分Dto
     *          certifiedInfoId    物业信息Id
     *          certifiedInfoScore 物业评分
     * 方法: 给所有certifiedInfoId的物业信息赋分certifiedInfoScore
     *      1.查询certifiedInfoId对应的物业信息
     *      2.在Java层面修改物业评分certifiedInfoScore
     *      3.批量修改 (CertifiedInfoService业务层方法 saveOrUpdateBatch)
     * */
    public void certifiedScoring(CertifiedScoreForm form) throws Exception {
        Result result = certifiedClient.certifiedScoring(form);
        ResultUtil.checkResult(result);
    }
    /**
     * 检查后获得用户账号
     * 参数: 用户Id userId
     * 返回: 用户Id userId
     *      用户账号 userAccount
     * */
    public UserAccountDto getUser(Integer userId) throws Exception {
        Result<UserAccountDto> result = userClient.selectUserAccountById(userId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得用户信息
     * 参数: 用户信息Id userInfoId
     * 返回: 用户名称 userInfoName
     *      用户电话 userInfoTel
     *      用户年龄 userInfoAge
     *      用户头像 userInfoImg
     * */
    public UserInfoDto getUserInfo(Integer userInfoId) throws Exception {
        Result<UserInfoDto> result = userClient.selectUserInfoById(userInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得用户信息
     * 参数: 用户车辆Id userCarId
     * 返回: 车牌号 userCarPlate
     *      车辆联系人 carContacts
     *      车辆联系人电话 carContractsTek
     * */
    public UserCarDto getUserCar(Integer userCarId) throws Exception {
        Result<UserCarDto> result = userClient.selectUserCarById(userCarId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得出租客账号
     * 参数: 出租客Id rentersId
     * 返回: 出租客Id rentersId
     *      出租客账号 rentersAccount
     * */
    public RentersDto getRenters(Integer rentersId) throws Exception {
        Result<RentersDto> result = rentersClient.selectRentersById(rentersId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得出租客信息
     * 参数: 出租客信息Id rentersInfoId
     * 返回: 出租客姓名 rentersInfoName
     *      出租客年龄 rentersInfoAge
     *      出租客电话 rentersInfoTel
     *      出租客头像 rentersInfoImg
     * */
    public RentersInfoDto getRentersInfo(Integer rentersInfoId) throws Exception {
        Result<RentersInfoDto> result = rentersClient.selectRentersInfoById(rentersInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得平台账号
     * 参数: 平台账号Id platformId
     * 返回: 平台账号Id platformId
     *      平台账号 platformAccount
     * */
    public PlatformAccountDto getPlatform(Integer platformId) throws Exception {
        Result<PlatformAccountDto> result = platformClient.selectPlatformAccountById(platformId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得车位信息
     * 参数: 车位信息Id stallInfoId
     * 返回: 车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * */
    public StallDto getStallInfo(Integer stallInfoId) throws Exception {
        Result<StallDto> result = stallClient.selectStallInfoById(stallInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 检查后获得车位信息 无论是否下架
     * 参数: 车位信息Id stallInfoId
     * 返回: 车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * */
    public StallDto getStallInfo2(Integer stallInfoId) throws Exception {
        Result<StallDto> result = stallClient.selectStallInfoById(stallInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 根据车位信息ID查询车位出租时间计划
     * 参数: 车位信息Id       stallInfoId
     * 返回: 是否有出租计划    isPlan 0有出租计划 1没有出租计划(默认全天候出租)
     *      出租计划开始日期   startDate
     *      出租计划结束日期   endDate
     *      每日计划时间组     planTimes
     *                      开始时间      startTime
     *                      结束时间      endTime
     *                      举例 8点-12点 14点-18点 22点-24点 被表示为 {[startTime:8,endTime:12],[startTime:14,endTime:18],[startTime:22,endTime:24]}
     * 返回参数的条件:
     *       1. startDate<endDate
     *       2. planTimes 非空集 每个元素中 startTime取值0-23 endTime取值1-24 startTime<endTime
     *       3. planTimes 各个元素间不能交叉 也不能连续
     * */
    public StallRentDto getStallRent(Integer stallInfoId) throws Exception {
        Result<StallRentDto> result = stallClient.selectStallRentById(stallInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
    /**
     * 根据出租客信息ID查询车位信息
     * 参数: 出租客信息Id   rentersInfoId
     * 返回: 车位信息Id   stallInfoId
     *      车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * 方法: 1.查询rentersInfoId对应的所有车位 不论是否下架
     *      2.将车位信息放入Dto返回
     * */
    public List<StallDto> getStallInfoByRentersId(Integer rentersInfoId) throws Exception {
        Result<List<StallDto>> result = stallClient.selectStallInfoByRentersId(rentersInfoId);
        ResultUtil.checkResult(result);
        return result.getData();
    }
}
